package com.dc.designPattern._19_interpreter.impl;

import java.util.Map;
import java.util.Stack;

/**
 * Description: 解释器模式_环境类_计算器
 * @author: gdc
 * @date: 2021/6/8
 * @version 1.0
 */
public class Calculator {

    /**
     * 定义表达式
     */
    private Expression expression;

    public Calculator(String expressionStr) {
        // 设置运算先后顺序
        Stack<Expression> stack = new Stack<>();


        // 表达式拆分成字符数组
        char[] charArray = expressionStr.toCharArray();

        Expression left;
        Expression right;

        // 遍历我们的字符数组，即遍历 [a, +, b]
        // 针对不同的情况，做处理
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
                case '+':
                    // 从 stack 取出 left -> a
                    left = stack.pop();
                    // 取出右表达式
                    right = new VarExpression(String.valueOf(charArray[++i]));

                    // 将left和right构建的AddExpression加入到stack中
                    stack.push(new AddExpression(left, right));
                    break;
                case '-':
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                default:
                    // 如果是一个var就创建要给 VarExpression对象，并push到stack
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
                    break;
            }
        }

        // 当遍历完整个 char 数组后，stack 就得到最后 Expression
        this.expression = stack.pop();
    }

    public int run(Map<String, Integer> var) {
        // 最后将表达式 a+b 和 var={a=10,b=20}, 传递给expression的interpreter进行解释执行
        return expression.interpreter(var);
    }
}
